MySQL BLOB 和 TEXT

MySQL BLOB 和 TEXT,主要内容有:

  • 起因介绍:一个 5.7.18 版本的 insert …… on duplicate 与 TEXT & BLOB 相关 bug
  • TEXT & BLOB 相同点
  • TEXT & BLOB 不同点

BLOB 和 TEXT

起因是一个 BUG:在 percona 5.7.18 版本中,在 insert …… on duplicated 下包含 text 字段有可能导致实例重启,具体的bug

故想看下 BLOB 和 TEXT 在日常中的区别。参考的主要是官方文档:The BLOB and TEXT Types,其中:

共同的坑:

  • 包含 TEXT or BLOG 且用到了 temporary table 的情况,会导致 temporary table 实际使用的是 on-disk 而不是 in-memory,可以通过参数 Created_tmp_disk_tables 来验证。细节参考 Internal Temporary Table Use in MySQL
  • 没有默认值
  • 最大的长度其实会受限于:max_allowed_packet,并且这个值在 client 端和 server 端其实是都有的
  • 当你想要对 BLOB 和 TEXT 创建索引的时候,必须指定索引的长度
  • 排序的时候,只会用到 max_sort_length 指定长度的内容

不同的地方:

  • 排序不同:BLOB 是根据 numeric values of the bytes 排序,TEXT 是字符串顺序
  • strict SQL mode 对 BLOB 和 TEXT 的截断操作不一样:超出 column 的 max_len

btw,如果测试的时候插入 BLOB,可以参考:如何插入BLOB